home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / mint / mgr / sparcmgr / demo3.zoo / demo / misc / dmgr.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-03-21  |  5.6 KB  |  274 lines

  1. /*                        Copyright (c) 1987 Bellcore
  2.  *                            All Rights Reserved
  3.  *       Permission is granted to copy or use this program, EXCEPT that it
  4.  *       may not be sold for profit, the copyright notice must be reproduced
  5.  *       on copies, and credit should be given to Bellcore where it is due.
  6.  *       BELLCORE MAKES NO WARRANTY AND ACCEPTS NO LIABILITY FOR THIS PROGRAM.
  7.  */
  8. /*    $Header: dmgr.c,v 4.1 88/06/30 10:06:21 bianchi Exp $
  9.     $Source: /tmp/mgrsrc/demo/misc/RCS/dmgr.c,v $
  10. */
  11. static char    RCSid_[] = "$Source: /tmp/mgrsrc/demo/misc/RCS/dmgr.c,v $$Revision: 4.1 $";
  12.  
  13. /* Ditroff to MGR conversion filter  (sample version) */
  14.  
  15. #include "term.h"
  16. #include <signal.h>
  17. #include    <ctype.h>
  18.  
  19. /* ditroff macros */
  20.  
  21. #define t_push()    
  22. #define t_pop()
  23. #define hmot(N)        (hpos+=(N))
  24. #define hgoto(N)    (hpos = (N))
  25. #define vmot(N)        (vpos+=(N))
  26. #define vgoto(N)    (vpos=(N))
  27. #define put1s(c)        put1('?')
  28. #define put1a(N)    printf("\\%3.3o",N);
  29. #define t_text(S)    printf("{%s}",S)
  30. #define draw(S)        printf("\nDRAW %s\n",S);
  31. #define setfont(S)    (font=(S))
  32. #define setsize(N)    (size=(N))
  33. #define t_page()    (page++>0?(getpass("\007"),m_clear()):0)
  34. #define t_newline()    m_flush()
  35. #define t_init()
  36. #define t_trailer()
  37. #define t_reset(C)
  38. #define    loadfont(N, S1, S2)
  39. #define error        printf
  40. #define done()        getpass("\007")
  41.  
  42. /* mgr defines */
  43.  
  44. #define GMAX    1000        /* maximum coordinate */
  45.  
  46. /* these should be calculated from the ditroff input file */
  47.  
  48. #define PAGE_WIDE    2300    /* page width (pixels) */
  49. #define PAGE_HIGH    3200    /* page height (pixels) */
  50.  
  51. int hpos,vpos;
  52. int font;
  53. int size;
  54. int page=0;
  55.  
  56. main()
  57.    {
  58.  
  59.     int clean();
  60.  
  61.     /* setup MGR */
  62.  
  63.     m_setup(M_DEBUG);
  64.    m_push(P_FLAGS|P_FONT);
  65.    signal(SIGTERM,clean);
  66.    signal(SIGINT,clean);
  67.    m_setmode(M_OVERSTRIKE);
  68.     m_func(14);
  69.    /* m_font(4); */
  70.     m_clear();
  71.  
  72.     /* display output */
  73.  
  74.    conv(stdin);
  75.  
  76.     /* wait for ack. */
  77.  
  78.     getpass("\007");
  79.    clean(0);
  80.    }
  81.  
  82. /* print a character */
  83.  
  84. int
  85. put1(c)
  86. register char c;        /* the character to print */
  87.     {
  88.     register int x = hpos * GMAX / PAGE_WIDE;
  89.    register int y = vpos * GMAX / PAGE_HIGH;
  90.  
  91.     m_movecursor(x,y);
  92.     putc(c,m_termout);
  93.     switch(font) {
  94.         case 2:    /* italic */
  95.             m_printstr("\010_");
  96.             break;
  97.         case 3:    /* bold */
  98.             m_incr(2);
  99.             break;
  100.         }
  101.     }
  102.  
  103. /* do ditroff conversion (standard template) */
  104.  
  105. conv(fp)
  106. register FILE *fp;
  107. {
  108.     register int c, k, sign;
  109.     int m, n, i, n1, m1;
  110.     char str[100], buf[300];
  111.  
  112.     while ((c = getc(fp)) != EOF) {
  113.         switch (c) {
  114.         case '\n':    /* when input is text */
  115.         case ' ':
  116.         case 0:        /* occasional noise creeps in */
  117.             break;
  118.         case '{':    /* push down current environment */
  119.             t_push();
  120.             break;
  121.         case '}':
  122.             t_pop();
  123.             break;
  124.         case '0': case '1': case '2': case '3': case '4':
  125.         case '5': case '6': case '7': case '8': case '9':
  126.             /* two motion digits plus a character */
  127.             hmot((c-'0')*10 + getc(fp)-'0');
  128.             put1(getc(fp));
  129.             break;
  130.         case 'c':    /* single ascii character */
  131.             put1(getc(fp));
  132.             break;
  133.         case 'C':
  134.             fscanf(fp, "%s", str);
  135.             put1s(str);
  136.             break;
  137.         case 'N':    /* absolute character number */
  138.             fscanf(fp, "%d", &n);
  139.             put1a(n);
  140.             break;
  141.         case 't':    /* straight text */
  142.             fgets(buf, sizeof(buf), fp);
  143.             t_text(buf);
  144.             break;
  145.         case 'D':    /* draw function */
  146.             fgets(buf, sizeof(buf), fp);
  147.                         draw(buf);
  148.             break;
  149.         case 's':
  150.             fscanf(fp, "%d", &n);    /* ignore fractional sizes */
  151.             setsize(n);
  152.             break;
  153.         case 'f':
  154.             fscanf(fp, "%d", &n);
  155.             setfont(n);
  156.             if (n==3)    /* bold */
  157.                 m_func(1);
  158.             else if (n==1 || n==2)
  159.                 m_func(14);
  160.             break;
  161.         case 'H':    /* absolute horizontal motion */
  162.             /* fscanf(fp, "%d", &n); */
  163.             while ((c = getc(fp)) == ' ')
  164.                 ;
  165.             k = 0;
  166.             do {
  167.                 k = 10 * k + c - '0';
  168.             } while (isdigit(c = getc(fp)));
  169.             ungetc(c, fp);
  170.             hgoto(k);
  171.             break;
  172.         case 'h':    /* relative horizontal motion */
  173.             /* fscanf(fp, "%d", &n); */
  174.             while ((c = getc(fp)) == ' ')
  175.                 ;
  176.             k = 0;
  177.             sign = 1;
  178.             if (c == '-') {
  179.                 sign = -1;
  180.                 c = getc(fp);
  181.             }
  182.             do {
  183.                 k = 10 * k + c - '0';
  184.             } while (isdigit(c = getc(fp)));
  185.             ungetc(c, fp);
  186.             hmot(sign * k);
  187.             break;
  188.         case 'w':    /* word space */
  189.             break;
  190.         case 'V':
  191.             fscanf(fp, "%d", &n);
  192.             vgoto(n);
  193.             break;
  194.         case 'v':
  195.             fscanf(fp, "%d", &n);
  196.             vmot(n);
  197.             break;
  198.         case 'p':    /* new page */
  199.             fscanf(fp, "%d", &n);
  200.             t_page();
  201.             break;
  202.         case 'n':    /* end of line */
  203.             while (getc(fp) != '\n')
  204.                 ;
  205.             t_newline();
  206.             break;
  207.         case '#':    /* comment */
  208.             while (getc(fp) != '\n')
  209.                 ;
  210.             break;
  211.         case 'x':    /* device control */
  212.             devcntrl(fp);
  213.             break;
  214.         default:
  215.             error("unknown input character %o %c\n", c, c);
  216.             fprintf(stderr, "input context is:\n%c", c);
  217.             for (i = 0; i < 10; i++) {
  218.                 if (fgets(buf, sizeof(buf), fp) == NULL)
  219.                     break;
  220.                 fprintf(stderr, "%s", buf);
  221.             }
  222.             done();
  223.         }
  224.     }
  225.    }
  226.  
  227. devcntrl(fp)    /* interpret device control functions */
  228. FILE *fp;
  229. {
  230.         char str[20], str1[50], buf[50];
  231.     int c, n;
  232.  
  233.     fscanf(fp, "%s", str);
  234.     switch (str[0]) {    /* crude for now */
  235.     case 'i':    /* initialize */
  236.         t_init();
  237.         break;
  238.     case 'T':    /* device name */
  239.         fscanf(fp, "%s", buf);
  240.         break;
  241.     case 't':    /* trailer */
  242.         t_trailer();
  243.         break;
  244.     case 'p':    /* pause -- can restart */
  245.         t_reset('p');
  246.         break;
  247.     case 's':    /* stop */
  248.         t_reset('s');
  249.         break;
  250.     case 'r':    /* resolution assumed when prepared */
  251.         fscanf(fp, "%d", &n);
  252.         break;
  253.     case 'f':    /* font used */
  254.         fscanf(fp, "%d %s", &n, str);
  255.         fgets(buf, sizeof buf, fp);    /* in case there's a filename */
  256.         ungetc('\n', fp);    /* fgets goes too far */
  257.         str1[0] = 0;    /* in case there's nothing to come in */
  258.         sscanf(buf, "%s", str1);
  259.         loadfont(n, str, str1);
  260.         break;
  261.     }
  262.     while ((c = getc(fp)) != '\n')    /* skip rest of input line */
  263.         if (c == EOF)
  264.             break;
  265. }
  266.  
  267. int
  268. clean(n)
  269. int n;
  270.     {
  271.     m_pop();
  272.     m_clear();
  273.    }
  274.